package com.pizzaonline.utils;

import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.Document;
import org.jdom.output.*;
import org.jdom.xpath.XPath;

public class XMLControler {

	public static Document document;
	public static Element racine;

	/**
	 * Méthode de lecture d'un fichier XML
	 * @param fichier
	 * @throws Exception
	 */
	public static void readXMLFile(String fichier) throws Exception
	   {
	      SAXBuilder sxb = new SAXBuilder();
	      document = sxb.build(new File(fichier));
	      racine = document.getRootElement();
	   }

	
	/**
	 * Méthode de sauvegarde d'un fichier XML
	 * @param fichier
	 * @throws Exception
	 */
	public static void saveXMLFile(String fichier) throws Exception
	   {
	         XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
	         sortie.output(document, new FileOutputStream(fichier));
	   }
	   
		/**
		 * Méthode récupérant les ingrédients d'une pizza
		 * dans un fichier XML
		 * @param nom_pizza
		 * @param racine
		 * @return
		 */
		public static Vector getPizzaIngredients(String nom_pizza, Document racine){
			Vector res = null;
			Element temp;
			List listeNoeuds;
			try{
				res = new Vector();
				XPath xpa = XPath.newInstance("//Pizza[@nomPizza='"+nom_pizza+"']/Ingredient");  
				listeNoeuds = xpa.selectNodes(racine);
				Iterator iter = listeNoeuds.iterator();
				while(iter.hasNext()){
					temp = (Element) iter.next();
					String ingredient = xpa.valueOf(temp);
					res.add(ingredient);
				}	
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode récupérant les ingrédients d'une salade dans un fichier XML
		 * @param nom_salade
		 * @param racine
		 * @return
		 */
		public static Vector getSaladeIngredients(String nom_salade, Document racine){
			Vector res = null;
			Element temp;
			List listeNoeuds;
			try{
				res = new Vector();
				XPath xpa = XPath.newInstance("//Salade[@nomPizza='"+nom_salade+"']/Ingredient");  
				listeNoeuds = xpa.selectNodes(racine);
				Iterator iter = listeNoeuds.iterator();
				while(iter.hasNext()){
					temp = (Element) iter.next();
					String ingredient = xpa.valueOf(temp);
					res.add(ingredient);
				}	
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode récupérant le prix d'une boisson
		 * @param nom_boisson
		 * @return
		 */
		public static float getPrixBoisson(String nom_boisson){
			return getPrixElement("//Boisson[@nomBoisson='"+nom_boisson+"']/@prix");
		}
		
		/**
		 * Méthode récupérant le prix d'une salade
		 * @param nom_salade
		 * @return
		 */
		public static float getPrixSalade(String nom_salade){
			System.out.println(nom_salade);
			return getPrixElement("//Salade[@nomSalade='"+nom_salade+"']/@prix");
		}
		
		/**
		 * Méthode récupérant le prix d'un dessert
		 * @param nom_dessert
		 * @return
		 */
		public static float getPrixDessert(String nom_dessert){
			return getPrixElement("//Dessert[@nomDessert='"+nom_dessert+"']/@prix");
		}
	 
		/**
		 * Méthode récupérant le prix d'une pizza 
		 * @param nom_pizza
		 * @return
		 */
		public static float getPrixPizza(String nom_pizza){
			return getPrixElement("//Pizza[@nomPizza='"+nom_pizza+"']/@prix");
		}		
		
		/**
		 * Méthode récupérant le prix d'un menu dans le fichier XML
		 * @param nom_menu
		 * @return
		 */
		public static float getPrixMenu(String nom_menu){
			return getPrixElement("//Menu[@nom='"+nom_menu+"']/@prix");
		}
		 
		/**
		 * Méthode récupérant le prix d'un élément via une expression XPath
		 * @param xpathExpr
		 * @return
		 */
		private static float getPrixElement(String xpathExpr)
		{
			float res = 0;
			Attribute courant;
			String prix;
			try{
				//XPath xpa = XPath.newInstance("//Menu[@nom='"+nom_menu+"']/@prix");  
				courant = (Attribute)XPath.selectSingleNode(document,xpathExpr);
				//prix = xpa.valueOf(courant);
				prix=courant.getValue();
				res = Float.parseFloat(prix);
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode testant si une pizza est contenue dans un menu
		 * @param pizza
		 * @return
		 */
		public static boolean isMenuContainsPizza(String pizza){
			boolean res = false;
			try{
				List listNodes = XPath.selectNodes(document,"//Menu[@nomPizza='"+pizza+"']");
				if(listNodes.size()==0)	res = false;
				else res = true;
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode testant si une pizza est présente dans un menu particilier
		 * @param pizza
		 * @return
		 */
		public static boolean isMenuContainsPizza(String pizza, String menu){
			boolean res = false;
			try{
				List listNodes = XPath.selectNodes(document,"//Menu[@nom='"+menu+"' and @nomPizza='"+pizza+"']");
				if(listNodes.size()==0)	res = false;
				else res = true;
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode testant si une salade est contenue dans un menu
		 * @param salad
		 * @return
		 */
		public static boolean isMenuContainsSalad(String salad){
			boolean res = false;
			try{
				List listNodes = XPath.selectNodes(document,"//Menu[@nomSalade='"+salad+"']");
				if(listNodes.size()==0)	res = false;
				else res = true;
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode testant si un dessert est contenu dans un menu
		 * @param dessert
		 * @return
		 */
		public static boolean isMenuContainsDessert(String dessert){
			boolean res = false;
			try{
				List listNodes = XPath.selectNodes(document,"//Menu[@nomDessert='"+dessert+"']");
				if(listNodes.size()==0)	res = false;
				else res = true;
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode testant si une boisson est contenue dans un menu
		 * @param boisson
		 * @return
		 */
		public static boolean isMenuContainsDrink(String boisson){
			boolean res = false;
			try{
				List listNodes = XPath.selectNodes(document,"//Menu[@nomBoisson='"+boisson+"']");
				if(listNodes.size()==0)	res = false;
				else res = true;
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode testant si un ingrédient est présent dans une pizza
		 * @param ingredient
		 * @param pizza
		 * @return
		 */
		public static boolean isContainedByPizza(String ingredient, String pizza){
			boolean res = false;
			Element temp = null;
			try{
				temp = (Element)XPath.selectSingleNode(document, "//Pizza[@nomPizza='"+pizza+"' and Ingredient='"+ingredient+"']");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			if(temp != null)	res = true;
			return res;
		}
		
		
		/**
		 * Méthode testant si un ingrédient est présent dans une salade
		 * @param ingredient
		 * @param salade
		 * @return
		 */
		public static boolean isContainedBySalad(String ingredient, String salade){
			boolean res = false;
			Element temp = null;
			try{
				temp = (Element)XPath.selectSingleNode(document, "//Salade[@nomSalade='"+salade+"' and Ingredient='"+ingredient+"']");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			if(temp != null)	res = true;
			return res;
		}
		
		/**
		 * Méthode récupérant l'élément d'un menu dans le fichier XML
		 * @param nom_menu
		 * @return
		 */
		public static Element getElementMenu(String nom_menu){
			Element res = null;
			try{
				res = (Element)XPath.selectSingleNode(document, "//Menu[@nom='"+nom_menu+"']");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode récupérant l'élément d'une pizza dans le fichier XML
		 * @param nom_pizza
		 * @return
		 */
		public static Element getElementPizza(String nom_pizza){
			Element res = null;
			try{
				res = (Element)XPath.selectSingleNode(document, "//Pizza[@nomPizza='"+nom_pizza+"']");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode retournant tous les éléments Pizza du fichier XML
		 * @return
		 */
		public static List getPizzas(){
			List res = null;
			try{
				res = XPath.selectNodes(document, "//Pizza");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode retournant tous les éléments Boisson du fichier XML
		 * @return
		 */
		public static List getBoissons(){
			List res = null;
			try{
				res = XPath.selectNodes(document, "//Boisson");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode retournant tous les éléments Dessert du fichier XML
		 * @return
		 */
		public static List getDesserts(){
			List res = null;
			try{
				res = XPath.selectNodes(document, "//Dessert");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode retournant tous les éléments Salade du fichier XML
		 * @return
		 */
		public static List getSalades(){
			List res = null;
			try{
				res = XPath.selectNodes(document, "//Salade");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode récupérant l'élément d'une salade dans le fichier XML
		 * @param nom_salade
		 * @return
		 */
		public static Element getElementSalad(String nom_salade){
			Element res = null;
			try{
				res = (Element)XPath.selectSingleNode(document, "//Salade[@nomSalade='"+nom_salade+"']");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode retournant la liste des éléments de type Menu utilisant la pizza
		 * @param nom_pizza
		 * @return
		 */
		public static List getMenusOfPizza(String nom_pizza){
			List res = null;
			try{
				res = XPath.selectNodes(document, "//Menu[@nomPizza='"+nom_pizza+"']");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode retournant la liste des éléments de type Menu utilisant la salade
		 * @param nom_salade
		 * @return
		 */
		public static List getMenusOfSalad(String nom_salade){
			List res = null;
			try{
				res = XPath.selectNodes(document, "//Menu[@nomSalade='"+nom_salade+"']");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		
		/**
		 * Méthode retournant l'attribut Boisson d'un menu
		 * @param nom_menu
		 * @return
		 */
		public static Attribute getBoissonOfMenu(String nom_menu){
			Attribute res = null;
			try{
				res = (Attribute)XPath.selectSingleNode(document, "//Menu[@nom='"+nom_menu+"']/@nomBoisson");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode retournant l'attribut Salade d'un menu
		 * @param nom_menu
		 * @return
		 */
		public static Attribute getSaladOfMenu(String nom_menu){
			Attribute res = null;
			try{
				res = (Attribute)XPath.selectSingleNode(document, "//Menu[@nom='"+nom_menu+"']/@nomSalade");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
		/**
		 * Méthode retournant l'attribut Dessert d'un menu
		 * @param nom_menu
		 * @return
		 */
		public static Attribute getDessertOfMenu(String nom_menu){
			Attribute res = null;
			try{
				res = (Attribute)XPath.selectSingleNode(document, "//Menu[@nom='"+nom_menu+"']/@nomDessert");
			}
			catch(JDOMException jdom){
				jdom.printStackTrace();
			}
			return res;
		}
		
}
